查看原文
其他

Springboot 2 之 Spring Data Redis 实现消息队列 : 发布 / 订阅模式

ImportNew 2021-12-02

(点击上方公众号,可快速关注)


来源:Simonton ,

my.oschina.net/simonton/blog/1833775


一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。


实现之前先过过 redis 发布订阅的一些基础概念和操作。


Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式(Topic):发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。


接下来我们通过 Redis-cli 来简单看看效果:


1)通过 publish 来发布 topic message 



2)通过 subscribe 来订阅 topic 



接下来用springboot2 + spring data redis 来实现来简单实现订阅者模式:


spring data redis实现发布与订阅需要配置以下信息:


  • Topic

  • MessageListener

  • RedisMessageListenerContainer


1). 用到的 starter 只有 spring data redis starter: 


dependencies {

compile group: 'org.springframework.boot', name: 'spring-boot-starter-redis', version: '1.4.7.RELEASE'

testCompile('org.springframework.boot:spring-boot-starter-test')

}


2). 配置 spring data redis: 


package com.example.demo.redis.listener.redis.config;


import com.example.demo.redis.listener.ConsumerRedisListener;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;

import org.springframework.data.redis.listener.ChannelTopic;

import org.springframework.data.redis.listener.RedisMessageListenerContainer;


@Configuration

public class RedisConfig {


    @Autowired

    private JedisConnectionFactory jedisConnectionFactory;


    @Bean

    public ConsumerRedisListener consumerRedis() {

        return new ConsumerRedisListener();

    }


    @Bean

    public ChannelTopic topic() {

        return new ChannelTopic("string-topic");

    }


    @Bean

    public RedisMessageListenerContainer redisMessageListenerContainer() {


        RedisMessageListenerContainer container = new RedisMessageListenerContainer();

        container.setConnectionFactory(jedisConnectionFactory);


        container.addMessageListener(consumerRedis(),topic());

        return container;


    }


}


3) 实现一个String类型的 topic MessageListener 


package com.example.demo.redis.listener;


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.connection.Message;

import org.springframework.data.redis.connection.MessageListener;

import org.springframework.data.redis.core.StringRedisTemplate;


public class ConsumerRedisListener implements MessageListener {


    @Autowired

    private StringRedisTemplate stringRedisTemplate;


    @Override

    public void onMessage(Message message, byte[] pattern) {

        doBusiness(message);

    }


    /**

     * 打印 message body 内容

     * @param message

     */

    public void doBusiness(Message message) {

        Object value = stringRedisTemplate.getValueSerializer().deserialize(message.getBody());

        System.out.println("consumer message: " + String.valueOf(value));

    }

}


4) 其它:


记得配置上 redis 相关的配置,最简单的application.properties配置如下:


spring.redis.host=127.0.0.1

spring.redis.port=6379


通过上面四步,简单的订阅者就做好了,通过以下代码可以发布一个消息,同时可以查看到控制台会有订阅者消费信息打印出来:


@Autowired

private StringRedisTemplate stringRedisTemplate;


@Test

public void testRedisStringOps() {

stringRedisTemplate.convertAndSend("string-topic","hello world");


}



最后总结下:


用 spring data redis 来实现 redis 订阅者,本质上还是Listener模式,只需要配置Topic, MessageListener 和 RedisMessageListenerContainer就可以了。同时,发布时,只需要使用 redisTemplate 的 convertAndSend方法即可topic来发布message。


【关于投稿】


如果大家有原创好文投稿,请直接给公号发送留言。


① 留言格式:
【投稿】+《 文章标题》+ 文章链接

② 示例:
【投稿】《不要自称是程序员,我十多年的 IT 职场总结》:http://blog.jobbole.com/94148/

③ 最后请附上您的个人简介哈~



看完本文有收获?请转发分享给更多人

关注「ImportNew」,提升Java技能

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存